home *** CD-ROM | disk | FTP | other *** search
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;; ;;
- ;;; Centre for Speech Technology Research ;;
- ;;; University of Edinburgh, UK ;;
- ;;; Copyright (c) 1996,1997 ;;
- ;;; All Rights Reserved. ;;
- ;;; ;;
- ;;; Permission is hereby granted, free of charge, to use and distribute ;;
- ;;; this software and its documentation without restriction, including ;;
- ;;; without limitation the rights to use, copy, modify, merge, publish, ;;
- ;;; distribute, sublicense, and/or sell copies of this work, and to ;;
- ;;; permit persons to whom this work is furnished to do so, subject to ;;
- ;;; the following conditions: ;;
- ;;; 1. The code must retain the above copyright notice, this list of ;;
- ;;; conditions and the following disclaimer. ;;
- ;;; 2. Any modifications must be clearly marked as such. ;;
- ;;; 3. Original authors' names are not deleted. ;;
- ;;; 4. The authors' names are not used to endorse or promote products ;;
- ;;; derived from this software without specific prior written ;;
- ;;; permission. ;;
- ;;; ;;
- ;;; THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK ;;
- ;;; DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ;;
- ;;; ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT ;;
- ;;; SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE ;;
- ;;; FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ;;
- ;;; WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN ;;
- ;;; AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ;;
- ;;; ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF ;;
- ;;; THIS SOFTWARE. ;;
- ;;; ;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;
- ;;; Support for MBROLA as an external module.
- ;;;
-
- ;;; You might want to set this in your sitevars.scm
- (defvar mbrola_progname "/cstr/external/mbrola/mbrola"
- "mbrola_progname
- The program name for mbrola.")
- (defvar mbrola_database "fr1"
- "mbrola_database
- The name of the MBROLA database to usde during MBROLA Synthesis.")
-
- (define (MBROLA_Synth utt)
- "(MBROLA_Synth UTT)
- Synthesize using MBROLA as external module. Basically dump the info
- from this utterance. Call MBROLA and reload the waveform into utt.
- [see MBROLA]"
- (let ((filename (make_tmp_filename))
- )
- (save_segments_mbrola utt filename)
- (system (string-append mbrola_progname " "
- mbrola_database " "
- filename " "
- filename ".au"))
- (utt.import.wave utt (string-append filename ".au"))
- (apply_hooks after_synth_hooks utt)
- (delete-file filename)
- (delete-file (string-append filename ".au"))
- utt))
-
- (define (save_segments_mbrola utt filename)
- "(save_segments_mbrola UTT FILENAME)
- Save segment information in MBROLA format in filename. The format is
- phone duration (ms) [% position F0 target]*. [see MBROLA]"
- (let ((fd (fopen filename "w")))
- (mapcar
- (lambda (segment)
- (save_seg_mbrola_entry
- (item.feat segment 'name)
- (item.feat segment 'segment_start)
- (item.feat segment 'segment_duration)
- (mapcar
- (lambda (targ_item)
- (list
- (item.feat targ_item "pos")
- (item.feat targ_item "f0")))
- (item.relation.daughters segment 'Target)) ;; list of targets
- fd))
- (utt.relation.items utt 'Segment))
- (fclose fd)))
-
- (define (save_seg_mbrola_entry name start dur targs fd)
- "(save_seg_mbrola_entry ENTRY NAME START DUR TARGS FD)
- Entry contains, (name duration num_targs start 1st_targ_pos 1st_targ_val)."
- (format fd "%s %d " name (nint (* dur 1000)))
- (if targs ;; if there are any targets
- (mapcar
- (lambda (targ) ;; targ_pos and targ_val
- (let ((targ_pos (car targ))
- (targ_val (car (cdr targ))))
-
- (format fd "%d %d "
- (nint (* 100 (/ (- targ_pos start) dur))) ;; % pos of target
- (nint (parse-number targ_val))) ;; target value
- ))
- targs))
- (terpri fd)
- (terpri fd)
- )
-
- (provide 'mbrola)
-